#ifndef __BASE_CHANNEL_H__
#define __BASE_CHANNEL_H__

#include <memory>
#include <atomic>
#include "ThreadSafeQueue.hpp"
#include "NetConstants.h"

// 完成

namespace LiteNetLib
{
    class NetPeer;
    class NetPacket;

    class BaseChannel
    {
    protected:
        NetPeer *m_netPeer = nullptr;

        ThreadSafeQueue<NetPacket *> m_outgoingQueue;

        // // 用于判断通道是否在 NetPeer 的发送队列中
        // std::atomic<bool> m_isInPeerChannelSendQueue;

        // 用于判断通道是否在发送队列中
        std::atomic<bool> m_isInPeerChannelSendQueue;
        std::mutex addToQueueMutex;


    public:
        BaseChannel(NetPeer *netPeer);
        virtual ~BaseChannel();

        /***********************************************************************************************************
         * @brief 将要发送的包添加进发送队列中
         * @param packet 数据包，不能是 nullptr，不然会导致程序崩溃
        ***********************************************************************************************************/
        void addToQueue(NetPacket *packet);

        /***********************************************************************************************************
         * @brief 发包
         * @return false 发包失败的话，NetPeer 就不会将通道重新放回队列之中
        ***********************************************************************************************************/
        bool sendAndCheckQueue();

        /***********************************************************************************************************
         * @brief 清理并回收资源，若发送队列中有包的话，都交给包池回收处理
        ***********************************************************************************************************/
        virtual void clear();

        /***********************************************************************************************************
         * @brief 处理包
         * @return  false 这里没有处理包，外界应该对这个包进行回收或释放处理
         *          true 这里已经处理了包，外界不应该对这个包做额外的处理
        ***********************************************************************************************************/
        virtual bool processData(const char* dataBuff, uint32_t dataSize) = 0;

    protected:
        /***********************************************************************************************************
         * @brief 将自身添加到 NetPeer 的发送队列中
        ***********************************************************************************************************/
        void addToPeerSendQueue();

        virtual bool sendNextPackets() = 0;
    };
}

#endif
